/*******************************************************************************
* Copyright (c) 2016 Institute for Pervasive Computing, ETH Zurich and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Eclipse Distribution License v1.0 which accompany this distribution.
*
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.html.
*
* Contributors:
* Matthias Kovatsch - creator and main architect
* Yassin N. Hassan - Polyfill implementation
******************************************************************************/
package org.eclipse.californium.tools;
import com.google.gson.Gson;
import org.eclipse.californium.core.CoapClient;
import org.eclipse.californium.core.CoapResponse;
import org.eclipse.californium.core.coap.MediaTypeRegistry;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.servlet.DefaultServlet;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.websocket.server.ServerContainer;
import java.io.IOException;
import java.net.URL;
public class PolyfillProxy
{
public static void main(String[] args)
{
Server server = new Server();
ServerConnector connector = new ServerConnector(server);
connector.setPort(8080);
server.addConnector(connector);
// Setup the basic application "context" for this application at "/"
// This is also known as the handler tree (in jetty speak)
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.NO_SESSIONS);
context.setContextPath("/");
server.setHandler(context);
context.addServlet(CoapRequestServlet.class, "/request");
// add special pathspec of "/home/" content mapped to the homePath
ServletHolder holderHome = new ServletHolder("static-home", DefaultServlet.class);
String baseStr = "/webapp"; //... contains: helloWorld.html, login.html, etc. and folder: other/xxx.html
URL baseUrl = PolyfillProxy.class.getResource( baseStr );
String basePath = baseUrl.toExternalForm();
holderHome.setInitParameter("resourceBase", basePath);
holderHome.setInitParameter("dirAllowed", "false");
holderHome.setInitParameter("pathInfoOnly", "true");
context.addServlet(holderHome, "/*");
try
{
// Initialize javax.websocket layer
ServerContainer wscontainer = WebSocketServerContainerInitializer.configureContext(context);
// Add WebSocket endpoint to javax.websocket layer
wscontainer.addEndpoint(ObserveSocket.class);
server.start();
server.dump(System.err);
server.join();
}
catch (Throwable t)
{
t.printStackTrace(System.err);
}
}
public static class RequestDefinition {
public String method;
public String url;
public String payload;
}
@SuppressWarnings("serial")
public static class CoapRequestServlet extends HttpServlet {
@Override
protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setStatus(HttpServletResponse.SC_OK);
addCORSHeaders(resp);
}
private void addCORSHeaders(HttpServletResponse resp) {
resp.addHeader("Access-Control-Allow-Origin", "*");
resp.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
resp.addHeader("Access-Control-Allow-Headers", "Content-Type");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("application/json");
resp.setStatus(HttpServletResponse.SC_OK);
addCORSHeaders(resp);
Gson gson = new Gson();
RequestDefinition requestDefintion = gson.fromJson(req.getReader().readLine(), RequestDefinition.class);
CoapClient client = new CoapClient(requestDefintion.url);
client.setTimeout(10000);
CoapResponse response = null;
if (requestDefintion.method.equals("GET")){
response = client.get();
} else if (requestDefintion.method.equals("POST")){
response = client.post(requestDefintion.payload, MediaTypeRegistry.APPLICATION_JSON);
} else if (requestDefintion.method.equals("PUT")){
response = client.put(requestDefintion.payload, MediaTypeRegistry.APPLICATION_JSON);
} else if (requestDefintion.method.equals("DELETE")){
response = client.delete();
}
if(response != null) {
resp.getWriter().println(gson.toJson(new ResponseDefinition(response.getCode().value, response.getResponseText())));
} else {
resp.getWriter().println(gson.toJson(new ErrorDefinition("timeout")));
}
}
}
}